/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tomasio.projects.welcome.model;

import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoDTO;
import com.tomasio.projects.welcome.dto.PessoaDTO;
import com.tomasio.projects.welcome.dto.ProibicaoDeAcessoDTO;
import com.tomasio.projects.welcome.dto.TranseunteDTO;
import com.tomasio.projects.welcome.dto.VeiculoDTO;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author administrador
 */
public abstract class Transeunte {

    protected Long id;
    private Set<ProibicaoDeAcesso> proibicoesDeAcesso =
            new HashSet<ProibicaoDeAcesso>();
    private Set<AutorizacaoDeAcesso> autorizacoesDeAcesso =
            new HashSet<AutorizacaoDeAcesso>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Set<ProibicaoDeAcesso> getProibicoesDeAcesso() {
        return proibicoesDeAcesso;
    }

    public void setProibicoesDeAcesso(Set<ProibicaoDeAcesso> proibicoesDeAcesso) {
        this.proibicoesDeAcesso = proibicoesDeAcesso;
    }

    public void addProibicaoDeAcesso(ProibicaoDeAcesso proibicao) {
        this.proibicoesDeAcesso.add(proibicao);
    }

    public Set<AutorizacaoDeAcesso> getAutorizacoesDeAcesso() {
        return autorizacoesDeAcesso;
    }

    public void setAutorizacoesDeAcesso(Set<AutorizacaoDeAcesso> autorizacoesDeAcesso) {
        this.autorizacoesDeAcesso = autorizacoesDeAcesso;
    }

    public void addAutorizacaoDeAcesso(AutorizacaoDeAcesso autorizacao) {
        this.autorizacoesDeAcesso.add(autorizacao);
    }

    public TranseunteDTO createDTO() {
        TranseunteDTO dto = instantiateDTO();
        dto.setId(id);
        dto.setAuthorized(this.isAuthorized());
        dto.setForbbiden(this.isForbbiden());

        Set<ProibicaoDeAcessoDTO> proibicoesDTO = new HashSet<ProibicaoDeAcessoDTO>();
        for (ProibicaoDeAcesso proibicaoDeAcesso : proibicoesDeAcesso) {
            proibicoesDTO.add(proibicaoDeAcesso.createDTO());
        }
        dto.setProibicoesDeAcesso(proibicoesDTO);

        Set<AutorizacaoDeAcessoDTO> autorizacaoDeAcessoDTO = new HashSet<AutorizacaoDeAcessoDTO>();
        for (AutorizacaoDeAcesso autorizacaoDeAcesso : autorizacoesDeAcesso) {
            autorizacaoDeAcessoDTO.add(autorizacaoDeAcesso.createDTO());
        }
        dto.setAutorizacoesDeAcesso(autorizacaoDeAcessoDTO);
        return dto;
    }

    protected abstract TranseunteDTO instantiateDTO();

    protected void fillAttributesFromDTO(TranseunteDTO dto) {
        this.id = dto.getId();
        for (ProibicaoDeAcessoDTO proibicaoDTO : dto.getProibicoesDeAcesso()) {
            proibicoesDeAcesso.add(new ProibicaoDeAcesso(proibicaoDTO));
        }
    }

    public static Transeunte instantiate(TranseunteDTO dto) {
        if (dto instanceof PessoaDTO) {
            return new Pessoa((PessoaDTO) dto);
        } else {
            return new Veiculo((VeiculoDTO) dto);

        }
    }

    public boolean isAuthorized() {

        boolean result = false;
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");


        for (AutorizacaoDeAcesso autorizacao : autorizacoesDeAcesso) {
            Date dataInicial = null;
            Date dataFinal = null;
            Date dataAtual = null;

            
            try {
                dataInicial = formatter.parse(formatter.format(autorizacao.getPeriodo().getDataInicial()));
                if (autorizacao.getPeriodo().getDataFinal() != null) {
                    dataFinal = formatter.parse(formatter.format(autorizacao.getPeriodo().getDataFinal()));
                }
                dataAtual = formatter.parse(formatter.format(new Date()));

            } catch (ParseException ex) {
                Logger.getLogger(Transeunte.class.getName()).log(Level.SEVERE, null, ex);
                return result;
            }



            if (dataFinal == null) {
                result = true;
            } else {
                if ((dataFinal.after(dataAtual) || dataFinal.equals(dataAtual))
                        && (dataInicial.before(dataAtual) || dataInicial.equals(dataAtual))) {
                    result = true;
                }

            }


        }

        return result;
    }
    public boolean isForbbiden() {

        boolean result = false;
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");


        for (ProibicaoDeAcesso proibicao : proibicoesDeAcesso) {
            Date dataInicial = null;
            Date dataFinal = null;
            Date dataAtual = null;


            try {
                dataInicial = formatter.parse(formatter.format(proibicao.getPeriodo().getDataInicial()));
                if (proibicao.getPeriodo().getDataFinal() != null) {
                    dataFinal = formatter.parse(formatter.format(proibicao.getPeriodo().getDataFinal()));
                }
                dataAtual = formatter.parse(formatter.format(new Date()));

            } catch (ParseException ex) {
                Logger.getLogger(Transeunte.class.getName()).log(Level.SEVERE, null, ex);
                return result;
            }



            if (dataFinal == null) {
                result = true;
            } else {
                if ((dataFinal.after(dataAtual) || dataFinal.equals(dataAtual))
                        && (dataInicial.before(dataAtual) || dataInicial.equals(dataAtual))) {
                    result = true;
                }

            }


        }

        return result;
    }

}
